// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <winsock2.h>

#include "net/base/winsock_init.h"

#include "base/lazy_instance.h"
#include "base/logging.h"

namespace {

class WinsockInitSingleton {
public:
    WinsockInitSingleton()
    {
        WORD winsock_ver = MAKEWORD(2, 2);
        WSAData wsa_data;
        bool did_init = (WSAStartup(winsock_ver, &wsa_data) == 0);
        if (did_init) {
            DCHECK(wsa_data.wVersion == winsock_ver);

            // The first time WSAGetLastError is called, the delay load helper will
            // resolve the address with GetProcAddress and fixup the import.  If a
            // third party application hooks system functions without correctly
            // restoring the error code, it is possible that the error code will be
            // overwritten during delay load resolution.  The result of the first
            // call may be incorrect, so make sure the function is bound and future
            // results will be correct.
            WSAGetLastError();
        }
    }

    ~WinsockInitSingleton()
    {
        // Don't call WSACleanup() since the worker pool threads can continue to
        // call getaddrinfo() after Winsock has shutdown, which can lead to crashes.
    }
};

static base::LazyInstance<WinsockInitSingleton> g_winsock_init_singleton = LAZY_INSTANCE_INITIALIZER;

} // namespace

namespace net {

void EnsureWinsockInit()
{
    g_winsock_init_singleton.Get();
}

} // namespace net
